La concurrence sur la planète rouge est l'art de gérer plusieurs opérations indépendantes — telles que la navigation des rovers, la télémetrie des signaux vitaux et les liaisons satellites — sans bloquer le système. En Go, une tâche exécutée de manière indépendante est appelée goroutine.
1. Le principe de non-déterminisme
Il est préférable de toujours supposer que les opérations dans différentes goroutines peuvent s'exécuter dans n'importe quel ordre. Comme le runtime Go planifie les tâches sur les cœurs disponibles, nous ne pouvons pas compter sur un rover terminant son analyse avant qu'un autre ne commence sa transmission sans synchronisation explicite.
2. Mécanismes de synchronisation
Pour gérer ces tâches, Go fournit deux outils principaux :
- Exclusion mutuelle : Les goroutines peuvent utiliser un
mutexpour s'exclure mutuellement de faire quelque chose en même temps. - L'instruction select : Cela ressemble à un bloc switch où chaque cas contient une réception ou une transmission sur un canal.
selectattend jusqu'à ce qu'un cas soit prêt, puis l'exécute.
3. L'ébauche du worker
Les workers à longue durée utilisent généralement une boucle infinie combinée à select pour surveiller simultanément plusieurs canaux de communication :
for {
select {
// Attendre les canaux ici.
}
}
}